package study.designpattern.singleton;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 读取配置文件，单例实现（饿汉式，装载类的时候就创建类实例）
 * 
 * 场景问题：在一个系统运行期间，某个类只需要一个类实例就可以了，那么应该怎么实现呢？
 * 解决方案：单例模式：保证一个类仅有一个实例，并提供一个访问它的全局访问点。
 * 
 * 单例模式的本质：控制实例的数目
 * 
 * 何时选用单例模式：
 *     当需要控制一个类的实例只能有一个，而且客户端只能从一个全局访问点访问它时。
 * 
 * @author taowei20061122@163.com
 *
 */
public class AppConfig {
	/**
	 * 定义一个变量，存储类实例，直接在这里创建类实例，只能创建一次
	 */
	private static AppConfig instance = new AppConfig();//饿汉式，装载类的时候就创建类实例
	/**
	 * 为客户端提供方法，返回创建好的实例
	 * @return
	 */
	public static AppConfig getInstance() {
		return instance;
	}
	/**
	 * 私有化构造方法
	 */
	private AppConfig() {
		//调用读取配置文件的方法
		System.out.println("在构造方法中读取配置文件....");
		readConfig();
	}
	/**
	 * 读取配置文件，设置属性值
	 */
	public void readConfig() {
		Properties properties = new Properties();
		
		InputStream in = AppConfig.class.getResourceAsStream("/AppConfig.properties");
		
		try {
			properties.load(in);
			//设置属性值
			parameterA = properties.getProperty("paramA");
			parameterB = properties.getProperty("paramB");
		} catch (IOException e) {
			System.out.println("装着配置文件出错，堆栈信息如下：");
			e.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
			}
		}

	}
	/**
	 * 用来存储配置文件中的参数A
	 */
	private String parameterA;
	/**
	 * 用来存储配置文件中的参数B
	 */
	private String parameterB;
	/**
	 * @return the parameterA
	 */
	public String getParameterA() {
		return parameterA;
	}
	/**
	 * @return the parameterB
	 */
	public String getParameterB() {
		return parameterB;
	}
	
	//测试装载类的时候就创建类实例
	public static void testClassLoader() {
		System.out.println("---testClassLoader---");
	}
}
